package com.cskaoyan.javase.array._3exception._4operation._4copy;

import javax.xml.transform.sax.SAXTransformerFactory;
import java.util.Arrays;

/**
 * 数组的长度是不可以改变的，
 * 所以如果想要实现数组元素"真正意义上的"删除和新增，一般需要使用数组的拷贝。
 * 大致思路是，创建一个新数组,然后拷贝赋值：
 *      首先需要明确新数组的长度，初始化这个新数组。
 *      然后遍历原先的数组，过滤掉（或者新增）一些元素，给新数组赋值。
 *
 * @since 17:44
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*int[] arr = {1, 2, 3};
        int[] result = realInsertElementInIntArr(arr, 4);
        System.out.println(Arrays.toString(result));*/

        int[] arr = {1, 2, 3, 3, 42, 23, 2, 3, 23, 2, 3, 4, 5};
        int[] result = realDeleteElementInIntArr(arr, 3);
        System.out.println(Arrays.toString(result));

    }

    // 需求1: 真正意义上在数组中新增一个元素
    /*
        分析:
            1.能不能直接在数组上新增一个元素(真正意义上的)?
                显然不可以,数组的长度不可变,所以必须要创建一个新数组,来存储新元素
            2.既然要创建新数组,那么新数组的长度是什么?
                新数组的长度 = 老数组的长度 + 1
            3.新数组创建完毕后,怎么给新数组赋值?
                遍历老数组,将老数组中的所有元素都添加进新数组
            4.最后再将新增的元素,赋值进去.
     */

    /**
     * 创建一个新数组,将老数组的元素拷贝过去,然后新增一个元素
     * 最后返回这个新数组
     * @param old 被新增元素的老数组
     * @param target 新增的元素
     * @return int[]
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/04/14 17:49
     */
    public static int[] realInsertElementInIntArr(int[] old, int target) {
        // 1.创建新数组
        int[] result = new int[old.length + 1];
        // 2.拷贝赋值
        // newIndex作为新数组的下标,给新数组中的元素赋值
        int newIndex = 0;
        for (int oldEle : old) {
            result[newIndex] = oldEle;
            newIndex++;
        }
        // 3.赋值新元素
        // 现在新数组只有一个空位置了,就是最后一个元素
        result[result.length - 1] = target;
        return result;
    }

    // 需求2: 真正意义上的删除数组中的某一种元素
    // 注: 元素可能不止一个,如果有多个,全部删除
    /*
        1.能不能直接在数组上删除一个元素(真正意义上的)?
            显然不可以,数组的长度不可变,所以必须要创建新数组,然后将要删除的元素过滤掉,给新数组赋值

        2.新数组的长度是多少?
            老数组的长度 - 被删除元素的个数
        3.新数组的元素怎么赋值?
             遍历老数组,然后过滤掉被删除的元素,给新数组赋值
     */
    public static int[] realDeleteElementInIntArr(int[] old, int target) {
        // 1.先统计被删除元素的个数,需要计数器
        int count = 0;
        for (int oldEle : old) {
            if (target == oldEle) {
                count++;
            }
        }
        // 遍历完数组后,count就是被删除元素的个数
        // 2.创建新数组
        int[] result = new int[old.length - count];

        // 3.遍历老数组,然后过滤掉被删除的元素,给新数组赋值
        // newIndex作为新数组的下标,给新数组中的元素赋值
        int newIndex = 0;
        for (int oldEle : old) {
            if (target == oldEle) {
                // 被删除的元素,过滤掉,不拷贝进新数组
                continue;
            }
            result[newIndex] = oldEle;
            newIndex++;
        }
        // 遍历赋值结束,直接返回新数组
        return result;
    }
}
